Marginal effectsとその周辺

多変量回帰・・・好きですか?

Nozomi Niimi

東京医療センター総合内科

2025-08-16

回帰分析について

皆さん多変量回帰は好きですか?

  • 古くから研究されつくされており、信頼感がある

  • 多くの統計ソフトに入っており、行うのが簡単

  • 解釈性が高く、分かりやすい

  • 本当?

多変量回帰は簡単?

Many regression species

  • 多変量回帰は多くの種類がある
    • 0/1でLogistic回帰
    • 整数値だとPoisson回帰
    • 順序ロジット
    • Censored regression(Cox回帰もこのうち)
  • 選択肢が多く、その分どうすればよいのか分からない!

例えば・・・・・・

  • ICU入室患者に対してRHCが予後を改善するかをみた観察研究(Connors et al. 1996)
    • Propensity scoreを広めた研究としても有名
  • 例えば、RHCが半年以内の死亡と関連するかをロジスティック回帰で解析をする
Parameter Base model
swang1 (RHC) 1.16 [1.01, 1.32], p =0.030
cat chf (Others) 1.71 [1.29, 2.25], p <0.001
age 1.03 [1.03, 1.04], p <0.001
Observations 5733
  • 結果として、RHCは半年以内の死亡と関連する!
  • しかし、ここで上司からのつっこみ

上司からのつっこみ①

結果①

Parameter Base model Interact model
swang1 (RHC) 1.16 [1.01, 1.32], p =0.030 1.52 [1.02, 2.26], p =0.041
cat chf (Others) 1.71 [1.29, 2.25], p <0.001 1.94 [1.40, 2.69], p <0.001
age 1.03 [1.03, 1.04], p <0.001 1.03 [1.03, 1.04], p <0.001
swang1 (RHC) × cat chf (Others) 0.74 [0.49, 1.12], p =0.158
Observations 5733 5733

上司からのつっこみ②

結果②

Parameter Base model Interact model Spline model
swang1 (RHC) 1.16 [1.01, 1.32], p =0.030 1.52 [1.02, 2.26], p =0.041 1.49 [1.00, 2.23], p =0.049
cat chf (Others) 1.71 [1.29, 2.25], p <0.001 1.94 [1.40, 2.69], p <0.001 1.94 [1.40, 2.70], p <0.001
age 1.03 [1.03, 1.04], p <0.001 1.03 [1.03, 1.04], p <0.001
swang1 (RHC) × cat chf (Others) 0.74 [0.49, 1.12], p =0.158 0.75 [0.49, 1.14], p =0.172
rcs(age ( degree) 0.99 [0.96, 1.01], p =0.325
rcs(age ( degree) 1.04 [0.89, 1.21], p =0.611
rcs(age ( degree) 1.04 [1.03, 1.05], p <0.001
Observations 5733 5733 5733

最終的に・・・・・・

例えば、2つの連続値をSplineで表したの場合

  • 解釈・・・・・・

我々はどこにいる?

こんな時にJAMA!

我々(臨床医)のしたい事

  • 根本的な問いかけ
    • 「誰への治療効果ですか?」
    • 「どうやった時の治療効果ですか?」

線形回帰の係数だと駄目な理由は?

  • 線形回帰の係数の解釈 = 条件付き期待値
    • 他の値を固定した時に、その因子を1単位変化した時の平均的なアウトカムの変化量
  • その結果、係数(OR, HRなど)という1つの値にまるめてしまう
  • 複雑な関係性をこの係数のみを報告する事で逆にわかりにくくなる事もある
  • Ex. HFmrEFとHFrEFでARNIの効果が変わる

じゃあ、どうやって報告する?

  • 「誰に?」「何が?」「どのくらい?」変化したら、アウトカムが変化するか?
  • 難しい言葉でいうと“Estimand”を報告する必要がある
  • 例えば
    1. 群全体: ATE
    2. 治療を受けた群全体: ATT
    3. 治療を受けなかった群全体: ATU

ここまでの纏め

  • 多変量解析は解釈がわかりにくい!
    • 特に、InteractionやSplineが入るとよりわかりにくい
    • 通常の解析だと、結果は集団全体の平均で丸め込まれてしまう
      • Estimandをどうやって出せばいい?

Standardizationあるいは prametric g-formulaの基礎

Marginal effectsという選択肢

  • G-computationを用いて限界効果を出す手法
  • 本来は、結果のStandardizationの手法
  • Estimandを決定する方法でもある(Hernan 2024)

G-computationの考え方

実践①

  • 生データ
# A tibble: 5,733 × 6
   rowid swang1 estimate conf.low conf.high death_01
   <int> <chr>     <dbl>    <dbl>     <dbl>    <dbl>
 1     1 No RHC    0.606    0.535     0.672        0
 2     2 RHC       0.839    0.787     0.880        1
 3     3 RHC       0.743    0.675     0.801        0
 4     4 No RHC    0.746    0.684     0.800        1
 5     5 RHC       0.872    0.830     0.904        1
 6     6 No RHC    0.780    0.721     0.829        0
 7     7 No RHC    0.585    0.519     0.648        0
 8     8 No RHC    0.287    0.231     0.350        1
 9     9 No RHC    0.315    0.247     0.394        0
10    10 RHC       0.593    0.535     0.648        0
# ℹ 5,723 more rows
  • 元データ+swang1列のみ変更して複製したデータセット
# A tibble: 11,466 × 6
   rowid swang1 estimate conf.low conf.high death_01
   <int> <chr>     <dbl>    <dbl>     <dbl>    <dbl>
 1     1 No RHC    0.606    0.535     0.672        0
 2     2 No RHC    0.823    0.768     0.868        1
 3     3 No RHC    0.721    0.651     0.782        0
 4     4 No RHC    0.746    0.684     0.800        1
 5     5 No RHC    0.859    0.815     0.893        1
 6     6 No RHC    0.780    0.721     0.829        0
 7     7 No RHC    0.585    0.519     0.648        0
 8     8 No RHC    0.287    0.231     0.350        1
 9     9 No RHC    0.315    0.247     0.394        0
10    10 No RHC    0.567    0.508     0.623        0
# ℹ 11,456 more rows
  • 行数が2倍(5733→11466)になっている事に注意!

実践②


 swang1 Estimate Std. Error    z Pr(>|z|)   S 2.5 % 97.5 %
 No RHC    0.638    0.00792 80.5   <0.001 Inf 0.623  0.654
 RHC       0.666    0.01034 64.4   <0.001 Inf 0.645  0.686

Type: response
  • swang1毎でのestimateを纏める
  • 差をとったらRisk differenceを出せる
  • この結果を変形する事で色々な数値を出せる。

実践③

Risk ratio


 Estimate Pr(>|z|)   S 2.5 % 97.5 %
     1.04   0.0433 4.5     1   1.09

Term: swang1
Type: response
Comparison: ln(mean(RHC) / mean(No RHC))

Odds ratio


 Estimate Pr(>|z|)   S 2.5 % 97.5 %
     1.13   0.0454 4.5     1   1.27

Term: swang1
Type: response
Comparison: ln(odds(RHC) / odds(No RHC))
  • 疫学的にはリスク差(あるいはリスク比)が最も知りたい数値
  • Odds ratioは発生率が低いイベントでないと、Risk ratioと近似出来ない(Cummings 2009)

G-computtionの応用

G-computationの応用~ATE/ATT/ATU

  • 元データのうち、元々Interventionが0/1の群だけで同様の事をするとATT/ATUも推定可能
  • Interventionだけでなくても、興味がある変数を動かす事で周辺効果(marginal effect)を出すことが可能

実践④

  • 例えば、患者背景がCHFでRHCの効果がどうなるかをみたい時
# A tibble: 10,554 × 7
   rowid swang1 cat_chf estimate conf.low conf.high death_01
   <int> <chr>  <chr>      <dbl>    <dbl>     <dbl>    <dbl>
 1     1 No RHC Others     0.606    0.535     0.672        0
 2     2 No RHC Others     0.823    0.768     0.868        1
 3     3 No RHC Others     0.721    0.651     0.782        0
 4     4 No RHC Others     0.746    0.684     0.800        1
 5     5 No RHC Others     0.859    0.815     0.893        1
 6     6 No RHC Others     0.780    0.721     0.829        0
 7     7 No RHC Others     0.585    0.519     0.648        0
 8     8 No RHC Others     0.287    0.231     0.350        1
 9     9 No RHC Others     0.315    0.247     0.394        0
10    10 No RHC Others     0.567    0.508     0.623        0
# ℹ 10,544 more rows

 swang1 Estimate Std. Error    z Pr(>|z|)     S 2.5 % 97.5 %
 No RHC    0.562     0.0306 18.3   <0.001 247.4 0.502  0.622
 RHC       0.651     0.0317 20.5   <0.001 307.8 0.588  0.713

Type: response
  • まずは、原疾患が心不全以外の患者を抜粋
  • RHCのみ0と1両者でそれ以外の列を複製したデータセットを作成
  • RHC毎の死亡率を計算
# A tibble: 456 × 6
   swang1 cat_chf estimate conf.low conf.high death_01
   <chr>  <chr>      <dbl>    <dbl>     <dbl>    <dbl>
 1 RHC    CHF       0.0967 0.000843     0.193        1
 2 No RHC CHF       0.0904 0.00145      0.179        1
 3 No RHC CHF       0.0793 0.00122      0.157        0
 4 No RHC CHF       0.0945 0.000226     0.189        1
 5 No RHC CHF       0.100  0.00131      0.199        0
 6 No RHC CHF       0.0998 0.00141      0.198        0
 7 No RHC CHF       0.0954 0.00136      0.189        1
 8 RHC    CHF       0.0949 0.00119      0.189        0
 9 No RHC CHF       0.0919 0.00161      0.182        1
10 No RHC CHF       0.0816 0.000612     0.163        1
# ℹ 446 more rows

 Estimate Pr(>|z|)   S 2.5 % 97.5 %
     1.16   0.0474 4.4     1   1.34

Term: swang1
Type: response
Comparison: ln(mean(RHC) / mean(No RHC))
  • CHFの患者のみ抜き出し、回帰モデルを元にRHCとNo RHCのRiskの差を一人ずつ計算を計算する
  • 平均して1つの数値を出す

G-computationの応用~Propensity score match

  1. Propensity score matchを計算
  2. Matched cohortを作成
  3. その上で、共変量を入れたアウトカムモデルで回帰を行う
  4. RCTの多変量と同じでバランスをちゃんと取れる
  5. どの群を選ぶかでATT/ATE/ATUも簡単に計算可能!(Greifer 2025)

実践⑤~準備

  • まずはPropensity score match行う
  • Matched dataを出す
  • Propensity scoreに用いた共変量を含めてアウトカムの回帰モデルを作成する
  • この重みも用いることに注意!
A `matchit` object
 - method: 1:1 nearest neighbor matching without replacement
 - distance: Propensity score
             - estimated with logistic regression
 - number of obs.: 5733 (original), 4366 (matched)
 - target estimand: ATT
 - covariates: cat_chf, age, sex, race, edu, income, wtkilo1, temp1, meanbp1, resp1, hrt1, pafi1, paco21, ph1, wblc1, hema1, sod1, pot1, crea1, bili1, alb1, cardiohx, chfhx, immunhx, transhx, amihx
matched data 
# A tibble: 4,366 × 6
   death_yn swang1 cat_chf   age distance weights
      <dbl> <chr>  <chr>   <dbl>    <dbl>   <dbl>
 1        0 No RHC Others   70.3    0.502       1
 2        1 RHC    Others   78.2    0.563       1
 3        0 RHC    Others   46.1    0.402       1
 4        1 No RHC Others   75.3    0.344       1
 5        1 RHC    Others   67.9    0.302       1
 6        0 No RHC Others   55.0    0.379       1
 7        1 No RHC Others   43.6    0.281       1
 8        0 No RHC Others   18.0    0.283       1
 9        0 RHC    Others   48.4    0.490       1
10        0 No RHC Others   34.4    0.393       1
# ℹ 4,356 more rows
アウトカムモデル 

Call:
glm(formula = death_01 ~ swang1 * cat_chf + rcs(age, 4) + crea1 + 
    sex + race + edu + income + wtkilo1 + temp1 + meanbp1 + resp1 + 
    hrt1 + pafi1 + paco21 + ph1 + wblc1 + hema1 + sod1 + pot1 + 
    bili1 + alb1 + cardiohx + chfhx + immunhx + transhx + amihx, 
    family = binomial, data = dat_m, weights = weights)

Coefficients:
                          Estimate Std. Error z value Pr(>|z|)    
(Intercept)              8.3720758  3.0519820   2.743 0.006085 ** 
swang1RHC                0.2979878  0.2142302   1.391 0.164234    
cat_chfOthers            0.6272870  0.1929188   3.252 0.001148 ** 
rcs(age, 4)age           0.0460262  0.0073111   6.295 3.07e-10 ***
rcs(age, 4)age'         -0.0300047  0.0153201  -1.959 0.050169 .  
rcs(age, 4)age''         0.1399522  0.0931435   1.503 0.132957    
crea1                    0.0105633  0.0179507   0.588 0.556221    
sexMale                  0.2461617  0.0722525   3.407 0.000657 ***
raceother                0.1766005  0.1651406   1.069 0.284892    
racewhite                0.0327267  0.0998068   0.328 0.742987    
edu                      0.0143607  0.0127289   1.128 0.259236    
income$11-$25k           0.0940105  0.1417030   0.663 0.507053    
income$25-$50k          -0.0403601  0.1402408  -0.288 0.773506    
incomeUnder $11k         0.3384458  0.1377695   2.457 0.014026 *  
wtkilo1                 -0.0051664  0.0013121  -3.937 8.23e-05 ***
temp1                   -0.0980770  0.0211773  -4.631 3.63e-06 ***
meanbp1                 -0.0033602  0.0009997  -3.361 0.000776 ***
resp1                    0.0063613  0.0025859   2.460 0.013895 *  
hrt1                     0.0028575  0.0009159   3.120 0.001809 ** 
pafi1                    0.0005013  0.0003571   1.404 0.160424    
paco21                   0.0004425  0.0038424   0.115 0.908323    
ph1                     -1.0754772  0.3902359  -2.756 0.005852 ** 
wblc1                    0.0015517  0.0028332   0.548 0.583905    
hema1                   -0.0201725  0.0049354  -4.087 4.36e-05 ***
sod1                     0.0034946  0.0046319   0.754 0.450575    
pot1                     0.0548594  0.0369037   1.487 0.137132    
bili1                    0.0572166  0.0093037   6.150 7.75e-10 ***
alb1                     0.0149816  0.0517212   0.290 0.772075    
cardiohx                 0.0058533  0.1012471   0.058 0.953898    
chfhx                    0.4574501  0.1187363   3.853 0.000117 ***
immunhx                  0.2341199  0.0796956   2.938 0.003307 ** 
transhx                 -0.3824780  0.0967037  -3.955 7.65e-05 ***
amihx                   -0.3281233  0.1715791  -1.912 0.055828 .  
swang1RHC:cat_chfOthers -0.2139280  0.2264226  -0.945 0.344752    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 5552.0  on 4365  degrees of freedom
Residual deviance: 5064.5  on 4332  degrees of freedom
AIC: 5132.5

Number of Fisher Scoring iterations: 4

実践⑤~結果

  • G-computationを各々の群で行う
# A tibble: 4,366 × 8
   rowid contrast     estimate conf.low conf.high death_01 swang1 weights
   <int> <chr>           <dbl>    <dbl>     <dbl>    <dbl> <chr>    <dbl>
 1     1 RHC - No RHC  0.0196  -0.0137     0.0529        0 No RHC       1
 2     2 RHC - No RHC  0.0120  -0.00850    0.0324        1 RHC          1
 3     3 RHC - No RHC  0.0163  -0.0115     0.0441        0 RHC          1
 4     4 RHC - No RHC  0.0156  -0.0110     0.0422        1 No RHC       1
 5     5 RHC - No RHC  0.00965 -0.00700    0.0263        1 RHC          1
 6     6 RHC - No RHC  0.0193  -0.0134     0.0519        0 No RHC       1
 7     7 RHC - No RHC  0.0169  -0.0120     0.0458        1 No RHC       1
 8     8 RHC - No RHC  0.0177  -0.0126     0.0480        0 No RHC       1
 9     9 RHC - No RHC  0.0201  -0.0140     0.0543        0 RHC          1
10    10 RHC - No RHC  0.0197  -0.0139     0.0533        0 No RHC       1
# ℹ 4,356 more rows
ここから計算する

 Estimate Pr(>|z|)   S 2.5 % 97.5 %
     1.03    0.122 3.0 0.992   1.07

Term: swang1
Type: response
Comparison: ln(mean(RHC) / mean(No RHC))
# A tibble: 2,183 × 8
   rowid contrast     estimate conf.low conf.high death_01 swang1 weights
   <int> <chr>           <dbl>    <dbl>     <dbl>    <dbl> <chr>    <dbl>
 1     1 RHC - No RHC  0.0120  -0.00850    0.0324        1 RHC          1
 2     2 RHC - No RHC  0.0163  -0.0115     0.0441        0 RHC          1
 3     3 RHC - No RHC  0.00965 -0.00700    0.0263        1 RHC          1
 4     4 RHC - No RHC  0.0201  -0.0140     0.0543        0 RHC          1
 5     5 RHC - No RHC  0.0207  -0.0145     0.0560        0 RHC          1
 6     6 RHC - No RHC  0.0199  -0.0140     0.0538        1 RHC          1
 7     7 RHC - No RHC  0.00868 -0.00604    0.0234        1 RHC          1
 8     8 RHC - No RHC  0.0165  -0.0115     0.0446        1 RHC          1
 9     9 RHC - No RHC  0.0146  -0.0106     0.0399        0 RHC          1
10    10 RHC - No RHC  0.0206  -0.0143     0.0556        1 RHC          1
# ℹ 2,173 more rows
ここから計算する

 Estimate Pr(>|z|)   S 2.5 % 97.5 %
     1.03    0.121 3.0 0.992   1.07

Term: swang1
Type: response
Comparison: ln(mean(RHC) / mean(No RHC))
# A tibble: 2,183 × 8
   rowid contrast     estimate conf.low conf.high death_01 swang1 weights
   <int> <chr>           <dbl>    <dbl>     <dbl>    <dbl> <chr>    <dbl>
 1     1 RHC - No RHC   0.0196 -0.0137     0.0529        0 No RHC       1
 2     2 RHC - No RHC   0.0156 -0.0110     0.0422        1 No RHC       1
 3     3 RHC - No RHC   0.0193 -0.0134     0.0519        0 No RHC       1
 4     4 RHC - No RHC   0.0169 -0.0120     0.0458        1 No RHC       1
 5     5 RHC - No RHC   0.0177 -0.0126     0.0480        0 No RHC       1
 6     6 RHC - No RHC   0.0197 -0.0139     0.0533        0 No RHC       1
 7     7 RHC - No RHC   0.0210 -0.0146     0.0565        1 No RHC       1
 8     8 RHC - No RHC   0.0203 -0.0143     0.0550        0 No RHC       1
 9     9 RHC - No RHC   0.0124 -0.00937    0.0342        0 No RHC       1
10    10 RHC - No RHC   0.0642 -0.0284     0.157         1 No RHC       1
# ℹ 2,173 more rows
ここから計算する

 Estimate Pr(>|z|)   S 2.5 % 97.5 %
     1.03    0.123 3.0 0.992   1.07

Term: swang1
Type: response
Comparison: ln(mean(RHC) / mean(No RHC))

G-computationの応用~Doubly robust

  1. Propensity score weightingを計算
  2. Outcomeを目標とする多変量回帰を作成
  3. 上記を組み合わせてDoubly robustを計算可能
  4. どの群を選ぶかでATT/ATE/ATUも簡単に計算可能!

実践⑤~結果

  1. treatmentを目的としたLogistic regressionを作成して、予測式を作成
  2. 予測式とATE/ATT/ATCでそれぞれ重み付けの計算方法を変える(ATOなどもあり)
  3. この重みを考慮したアウトカムモデルを作成する
  4. このアウトカムモデルで、各データでのG-computationを行う
  5. ATEは全体、ATTはRHC使用者、ATCはRHC不使用者
 
 重み付けの式 
A weightit object
 - method: "glm" (propensity score weighting with GLM)
 - number of obs.: 5733
 - sampling weights: none
 - treatment: 2-category
 - estimand: ATE
 - covariates: cat_chf, age, sex, race, edu, income, wtkilo1, temp1, meanbp1, resp1, hrt1, pafi1, paco21, ph1, wblc1, hema1, sod1, pot1, crea1, bili1, alb1, cardiohx, chfhx, immunhx, transhx, amihx

 重みを元のデータセットに追加 
# A tibble: 5,733 × 8
   death_01 swang_yn   age sex    race  cat_chf crea1 weights
      <dbl>    <dbl> <dbl> <chr>  <chr> <chr>   <dbl>   <dbl>
 1        0        0  70.3 Male   white Others  1.20     2.01
 2        1        1  78.2 Female white Others  0.600    1.78
 3        0        1  46.1 Female white Others  2.60     2.49
 4        1        0  75.3 Female white Others  1.70     1.53
 5        1        1  67.9 Male   white Others  3.60     3.31
 6        0        0  86.1 Female white Others  1.40     1.12
 7        0        0  55.0 Male   white Others  1        1.61
 8        1        0  43.6 Male   white Others  0.700    1.39
 9        0        0  18.0 Female white Others  1.70     1.39
10        0        1  48.4 Female white Others  0.5      2.04
# ℹ 5,723 more rows

 重みを考慮したアウトカムモデル 

Call:
WeightIt::glm_weightit(formula = death_01 ~ swang1 * cat_chf + 
    rcs(age, 4) + crea1 + sex + race + edu + income + wtkilo1 + 
    temp1 + meanbp1 + resp1 + hrt1 + pafi1 + paco21 + ph1 + wblc1 + 
    hema1 + sod1 + pot1 + bili1 + alb1 + cardiohx + chfhx + immunhx + 
    transhx + amihx, data = rhc_prep, family = binomial, weightit = wout_ate)

Coefficients:
            (Intercept)                swang1RHC            cat_chfOthers  
              6.2431313                0.4213975                0.5554860  
         rcs(age, 4)age          rcs(age, 4)age'         rcs(age, 4)age''  
              0.0387122               -0.0153697                0.0599765  
                  crea1                  sexMale                raceother  
              0.0131695                0.2002275                0.1047433  
              racewhite                      edu           income$11-$25k  
             -0.0776023                0.0280096                0.2348404  
         income$25-$50k         incomeUnder $11k                  wtkilo1  
             -0.0426852                0.4149254               -0.0032067  
                  temp1                  meanbp1                    resp1  
             -0.0830270               -0.0034465                0.0038987  
                   hrt1                    pafi1                   paco21  
              0.0029678                0.0005517               -0.0042080  
                    ph1                    wblc1                    hema1  
             -0.7636761                0.0007086               -0.0259974  
                   sod1                     pot1                    bili1  
              0.0015924                0.0750655                0.0595551  
                   alb1                 cardiohx                    chfhx  
             -0.0196740               -0.0686531                0.5082114  
                immunhx                  transhx                    amihx  
              0.2218184               -0.3666306               -0.1936546  
swang1RHC:cat_chfOthers  
             -0.2871238  
Standard error: HC0 robust (adjusted for estimation of weights)

 Risk ratio and 95% confidence interval

 Estimate Pr(>|z|)   S 2.5 % 97.5 %
     1.05   0.0291 5.1     1    1.1

Term: swang1
Type: probs
Comparison: ln(mean(RHC) / mean(No RHC))
 
 重み付けの式 
A weightit object
 - method: "glm" (propensity score weighting with GLM)
 - number of obs.: 5733
 - sampling weights: none
 - treatment: 2-category
 - estimand: ATT (focal: 1)
 - covariates: cat_chf, age, sex, race, edu, income, wtkilo1, temp1, meanbp1, resp1, hrt1, pafi1, paco21, ph1, wblc1, hema1, sod1, pot1, crea1, bili1, alb1, cardiohx, chfhx, immunhx, transhx, amihx

 重みを元のデータセットに追加 
# A tibble: 5,733 × 8
   death_01 swang_yn   age sex    race  cat_chf crea1 weights
      <dbl>    <dbl> <dbl> <chr>  <chr> <chr>   <dbl>   <dbl>
 1        0        0  70.3 Male   white Others  1.20    1.01 
 2        1        1  78.2 Female white Others  0.600   1    
 3        0        1  46.1 Female white Others  2.60    1    
 4        1        0  75.3 Female white Others  1.70    0.526
 5        1        1  67.9 Male   white Others  3.60    1    
 6        0        0  86.1 Female white Others  1.40    0.117
 7        0        0  55.0 Male   white Others  1       0.611
 8        1        0  43.6 Male   white Others  0.700   0.392
 9        0        0  18.0 Female white Others  1.70    0.394
10        0        1  48.4 Female white Others  0.5     1    
# ℹ 5,723 more rows

 重みを考慮したアウトカムモデル 

Call:
WeightIt::glm_weightit(formula = death_01 ~ swang1 * cat_chf + 
    rcs(age, 4) + crea1 + sex + race + edu + income + wtkilo1 + 
    temp1 + meanbp1 + resp1 + hrt1 + pafi1 + paco21 + ph1 + wblc1 + 
    hema1 + sod1 + pot1 + bili1 + alb1 + cardiohx + chfhx + immunhx + 
    transhx + amihx, data = rhc_prep, family = binomial, weightit = wout_att)

Coefficients:
            (Intercept)                swang1RHC            cat_chfOthers  
              8.6468892                0.2313120                0.5490938  
         rcs(age, 4)age          rcs(age, 4)age'         rcs(age, 4)age''  
              0.0487811               -0.0297895                0.1139380  
                  crea1                  sexMale                raceother  
              0.0060007                0.2465548                0.0313990  
              racewhite                      edu           income$11-$25k  
             -0.1276454                0.0269046               -0.0033263  
         income$25-$50k         incomeUnder $11k                  wtkilo1  
             -0.0861141                0.2440442               -0.0061903  
                  temp1                  meanbp1                    resp1  
             -0.0861481               -0.0034707                0.0066936  
                   hrt1                    pafi1                   paco21  
              0.0023754                0.0005454               -0.0035279  
                    ph1                    wblc1                    hema1  
             -1.1114260                0.0024665               -0.0214227  
                   sod1                     pot1                    bili1  
              0.0026557                0.0727514                0.0604808  
                   alb1                 cardiohx                    chfhx  
             -0.0395979                0.0564933                0.4867779  
                immunhx                  transhx                    amihx  
              0.2014825               -0.3366241               -0.3235800  
swang1RHC:cat_chfOthers  
             -0.1254310  
Standard error: HC0 robust (adjusted for estimation of weights)

 Risk ratio and 95% confidence interval

 Estimate Pr(>|z|)   S 2.5 % 97.5 %
     1.04    0.115 3.1 0.991   1.08

Term: swang1
Type: probs
Comparison: ln(mean(RHC) / mean(No RHC))
 
 重み付けの式 
A weightit object
 - method: "glm" (propensity score weighting with GLM)
 - number of obs.: 5733
 - sampling weights: none
 - treatment: 2-category
 - estimand: ATC (focal: 0)
 - covariates: cat_chf, age, sex, race, edu, income, wtkilo1, temp1, meanbp1, resp1, hrt1, pafi1, paco21, ph1, wblc1, hema1, sod1, pot1, crea1, bili1, alb1, cardiohx, chfhx, immunhx, transhx, amihx

 重みを元のデータセットに追加 
# A tibble: 5,733 × 8
   death_01 swang_yn   age sex    race  cat_chf crea1 weights
      <dbl>    <dbl> <dbl> <chr>  <chr> <chr>   <dbl>   <dbl>
 1        0        0  70.3 Male   white Others  1.20    1    
 2        1        1  78.2 Female white Others  0.600   0.777
 3        0        1  46.1 Female white Others  2.60    1.49 
 4        1        0  75.3 Female white Others  1.70    1    
 5        1        1  67.9 Male   white Others  3.60    2.31 
 6        0        0  86.1 Female white Others  1.40    1    
 7        0        0  55.0 Male   white Others  1       1    
 8        1        0  43.6 Male   white Others  0.700   1    
 9        0        0  18.0 Female white Others  1.70    1    
10        0        1  48.4 Female white Others  0.5     1.04 
# ℹ 5,723 more rows

 重みを考慮したアウトカムモデル 

Call:
WeightIt::glm_weightit(formula = death_01 ~ swang1 * cat_chf + 
    rcs(age, 4) + crea1 + sex + race + edu + income + wtkilo1 + 
    temp1 + meanbp1 + resp1 + hrt1 + pafi1 + paco21 + ph1 + wblc1 + 
    hema1 + sod1 + pot1 + bili1 + alb1 + cardiohx + chfhx + immunhx + 
    transhx + amihx, data = rhc_prep, family = binomial, weightit = wout_atc)

Coefficients:
            (Intercept)                swang1RHC            cat_chfOthers  
              4.2139813                0.5771091                0.5915078  
         rcs(age, 4)age          rcs(age, 4)age'         rcs(age, 4)age''  
              0.0332256               -0.0074427                0.0298757  
                  crea1                  sexMale                raceother  
              0.0224478                0.1741977                0.1419371  
              racewhite                      edu           income$11-$25k  
             -0.0438198                0.0285804                0.3960766  
         income$25-$50k         incomeUnder $11k                  wtkilo1  
             -0.0135415                0.5366253               -0.0017586  
                  temp1                  meanbp1                    resp1  
             -0.0796040               -0.0033540                0.0021765  
                   hrt1                    pafi1                   paco21  
              0.0033948                0.0005489               -0.0036611  
                    ph1                    wblc1                    hema1  
             -0.4927880               -0.0004794               -0.0280287  
                   sod1                     pot1                    bili1  
              0.0006330                0.0763670                0.0586712  
                   alb1                 cardiohx                    chfhx  
             -0.0068194               -0.1621082                0.5165472  
                immunhx                  transhx                    amihx  
              0.2322479               -0.3913542               -0.0822611  
swang1RHC:cat_chfOthers  
             -0.4241877  
Standard error: HC0 robust (adjusted for estimation of weights)

 Risk ratio and 95% confidence interval 

 Estimate Pr(>|z|)   S 2.5 % 97.5 %
     1.06   0.0271 5.2  1.01   1.12

Term: swang1
Type: probs
Comparison: ln(mean(RHC) / mean(No RHC))

G-computationの応用~機械学習を用いた手法

  • 厳密にはStandardizationとは違うが・・・・・・
  • Datasetを倍にして機械学習で推定する方法をS-learnerという
  • 因果推定を行う場合は、重み付けも行うD-learnerやX-learnerもある
  • 信頼区間やP値が出せないのが難点

実践⑤ モデル作成

  • Machine learning modelとしてXGBoostとする
  • ハイパーパラメーターはデフォルト
  • 何も考えずに、全体で学習させる
モデルの中身
Boosted Tree Model Specification (classification)

Computational engine: xgboost 
##### xgb.Booster
raw: 51.4 Kb 
call:
  xgboost::xgb.train(params = list(eta = 0.3, max_depth = 6, gamma = 0, 
    colsample_bytree = 1, colsample_bynode = 1, min_child_weight = 1, 
    subsample = 1), data = x$data, nrounds = 15, watchlist = x$watchlist, 
    verbose = 0, nthread = 1, objective = "binary:logistic")
params (as set within xgb.train):
  eta = "0.3", max_depth = "6", gamma = "0", colsample_bytree = "1", colsample_bynode = "1", min_child_weight = "1", subsample = "1", nthread = "1", objective = "binary:logistic", validate_parameters = "TRUE"
xgb.attributes:
  niter
callbacks:
  cb.evaluation.log()
# of features: 38 
niter: 15
nfeatures : 38 
evaluation_log:
  iter training_logloss
 <num>            <num>
     1        0.6358522
     2        0.6015622
   ---              ---
    14        0.4678196
    15        0.4606318

実践⑤ 仮想データ作成

# A tibble: 11,466 × 32
   rowidcf death_yn death_days swang_yn cat_chf cat1       age crea1 sex   race 
     <int>    <dbl>      <dbl>    <dbl> <chr>   <chr>    <dbl> <dbl> <chr> <chr>
 1       1        0        180        0 Others  COPD      70.3 1.20  Male  white
 2       2        1         45        1 Others  MOSF w/…  78.2 0.600 Fema… white
 3       3        0        180        1 Others  MOSF w/…  46.1 2.60  Fema… white
 4       4        1         37        0 Others  ARF       75.3 1.70  Fema… white
 5       5        1          2        1 Others  MOSF w/…  67.9 3.60  Male  white
 6       6        0        180        0 Others  COPD      86.1 1.40  Fema… white
 7       7        0        180        0 Others  MOSF w/…  55.0 1     Male  white
 8       8        1         38        0 Others  ARF       43.6 0.700 Male  white
 9       9        0        180        0 Others  MOSF w/…  18.0 1.70  Fema… white
10      10        0        180        1 Others  ARF       48.4 0.5   Fema… white
# ℹ 11,456 more rows
# ℹ 22 more variables: edu <dbl>, income <chr>, wtkilo1 <dbl>, temp1 <dbl>,
#   meanbp1 <dbl>, resp1 <dbl>, hrt1 <int>, pafi1 <dbl>, paco21 <dbl>,
#   ph1 <dbl>, wblc1 <dbl>, hema1 <dbl>, sod1 <int>, pot1 <dbl>, bili1 <dbl>,
#   alb1 <dbl>, cardiohx <int>, chfhx <int>, immunhx <int>, transhx <int>,
#   amihx <int>, swang1 <chr>

実践⑤ 結果を纏める

# A tibble: 11,466 × 4
   swang1 death_01 probability_1 predicted_class
   <chr>  <fct>            <dbl> <fct>          
 1 No RHC 0                0.536 1              
 2 No RHC 1                0.737 1              
 3 No RHC 0                0.570 1              
 4 No RHC 1                0.628 1              
 5 No RHC 1                0.726 1              
 6 No RHC 0                0.732 1              
 7 No RHC 0                0.531 1              
 8 No RHC 1                0.253 0              
 9 No RHC 0                0.369 0              
10 No RHC 0                0.400 0              
# ℹ 11,456 more rows
# A tibble: 2 × 2
  swang1 mean_death_prob
  <chr>            <dbl>
1 No RHC           0.642
2 RHC              0.655

G-computationの利点

  • 「この集団の介入を変えたら、どの程度良くなるか?」をダイレクトに伝えられる(King, Tomz, and Wittenberg 2000)
    • InteractionやSplineなど複雑な式でもシンプルに結果を伝えられる
  • 予測と因果を両方行う事が可能!

予測~Average marginal prediction

  • 通常のアウトカム式のみで一発勝負
  • 一応Biasを避けた上でのBias補正方法も存在する(Tibshirani et al. 2024)

因果~Average comparison

  • AIPWやTLMEを使った方が安心かもしれない
    • ただし、効率が悪い可能性もあり

G-computationでのAdvancedな統計結果の伝え方

  • 伝えるEstimandを正確に伝える
  • 「誰に」、「もし**したら」、「平均的にどのような効果?」が「どれくらいの確実性」あるかを言う
    • 出来るだけ、臨床的に意味がある差かどうかを考える

G-computationの限界

  • 基本的には通常の回帰と一緒
    • Unobserved confoundingやMisspecificationに弱い
  • 予測の為ではなく因果よりと考えたほうが良い
    • モデル作成でStep wiseや機械学習のようなやり方はしないほうが良い

最後に

Box先生の名言

すべてのモデルは誤っている。しかし、そのうちのいくつかは役に立つ。

RでのMarginal effectsの使い方

  • emmeans, marginaleffects, easystatsmodelbasedなど
  • AIMの論文にも記載があり使いやすいのはmarginaleffects

Thank you for your listening!!

References

Connors, A F, Jr, T Speroff, N V Dawson, C Thomas, F E Harrell Jr, D Wagner, N Desbiens, et al. 1996. “The Effectiveness of Right Heart Catheterization in the Initial Care of Critically Ill Patients. SUPPORT Investigators.” JAMA: The Journal of the American Medical Association 276 (11): 889–97. https://doi.org/10.1001/jama.276.11.889.
Cummings, Peter. 2009. “The Relative Merits of Risk Ratios and Odds Ratios.” Archives of Pediatrics & Adolescent Medicine 163 (5): 438–45. https://doi.org/10.1001/archpediatrics.2009.31.
Dahabreh, Issa J, and Kirsten Bibbins-Domingo. 2024. “Causal Inference about the Effects of Interventions from Observational Studies in Medical Journals.” JAMA: The Journal of the American Medical Association 331 (21): 1845–53. https://doi.org/10.1001/jama.2024.7741.
Greifer, Noah. 2025. “Estimating Effects After Matching.” https://cran.r-project.org/web/packages/MatchIt/vignettes/estimating-effects.html.
Hernan, Miguel A. 2024. Causal Inference: What If. Edited by James M. Robins. Boca Raton: Taylor & Francis.
King, Gary, Michael Tomz, and Jason Wittenberg. 2000. “Making the Most of Statistical Analyses: Improving Interpretation and Presentation.” American Journal of Political Science 44 (2): 347–61. https://doi.org/10.2307/2669316.
Tibshirani, Julie, Susan Athey, Erik Sverdrup, and Stefan Wager. 2024. Grf: Generalized Random Forests. https://github.com/grf-labs/grf.